package Exception;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;

public class ExceptionTest {
   
   /**
    * 该方法会自动调用finnaly,类似c# using
    * @throws IOException
    */
   private static void streamException () throws IOException
   {
      // 有final修饰的资源
      final BufferedReader br = new BufferedReader(new FileReader("a.java"));
      // 没有显式使用final修饰，但只要不对该变量重新赋值，该变量就是有效的
      final PrintStream ps = new PrintStream(new FileOutputStream("b.txt"));
      // 只要将两个资源放在try后的圆括号内即可
      try (br; ps) {
          // 使用两个资源
          System.out.println(br.readLine());
          ps.println("C语言中文网");
      }
   }

   /**
    * 多异常捕获
    捕获多种类型的异常时，多种异常类型之间用竖线|隔开
    */
   private static void MulitException(int a, int b)
   {
      try {
         int c = a / b;
         System.out.println("您输入的两个数相除的结果是：" + c);
     } catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException e) {
         System.out.println("程序发生了数组越界、数字格式异常、算术异常之一");
         // 捕获多异常时，异常变量默认有final修饰
         // 所以下面代码有错
         // e = new ArithmeticException("test");
     } catch (Exception e) {
         System.out.println("未知异常");
         // 捕获一种类型的异常时，异常变量没有final修饰
         // 所以下面代码完全正确
         e = new RuntimeException("test");
     }
   }

    public static void main(String[] args) {
        try
        {
            int a[] = new int[2];
            System.out.println("Access element three :" + a[3]);
         }
         catch(ArrayIndexOutOfBoundsException e)
         {
            
            System.out.println("Exception thrown  :" + e);
            System.out.println(e.getMessage());
            System.out.println(e.getCause());
            System.out.println(e.toString());
            e.printStackTrace();
         }
         finally
         {
            System.out.println("finally");
         }
         System.out.println("Out of the block");
    }
}
